package org.agent.aigccore.dao.mappers.postgres;

import org.agent.aigccore.basic.config.PostgresMapper;
import org.agent.aigccore.model.po.OpsLogPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.OffsetDateTime;
import java.util.List;
import java.util.Map;

/**
 * 操作日志Mapper接口
 * 提供日志的增删改查等操作
 */
@Mapper
@PostgresMapper
public interface OpsLogMapper {
    /**
     * 批量插入日志
     * @param list 日志列表
     * @return 插入数量
     */
    int batchInsert(@Param("list") List<OpsLogPO> list);
    
    /**
     * 分页查询日志
     * @param logType 日志类型
     * @param level 日志级别
     * @param app 应用名称
     * @param module 模块名称
     * @param action 操作名称
     * @param userId 用户ID
     * @param success 是否成功
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param keyword 搜索关键词
     * @param deviceId 设备ID
     * @param robotId 机器人ID
     * @param taskId 任务ID
     * @param pageSize 每页条数
     * @param offset 偏移量
     * @return 日志列表
     */
    List<OpsLogPO> selectByPage(
            @Param("logType") String logType,
            @Param("level") String level,
            @Param("app") String app,
            @Param("module") String module,
            @Param("action") String action,
            @Param("userId") String userId,
            @Param("success") Boolean success,
            @Param("startTime") OffsetDateTime startTime,
            @Param("endTime") OffsetDateTime endTime,
            @Param("keyword") String keyword,
            @Param("deviceId") String deviceId,
            @Param("robotId") String robotId,
            @Param("taskId") String taskId,
            @Param("extraField") String extraField,
            @Param("extraValue") String extraValue,
            @Param("deviceDataField") String deviceDataField,
            @Param("deviceDataValue") String deviceDataValue,
            @Param("pageSize") Integer pageSize,
            @Param("offset") Integer offset
    );
    
    /**
     * 根据条件统计日志数量
     * @param logType 日志类型
     * @param level 日志级别
     * @param app 应用名称
     * @param module 模块名称
     * @param action 操作名称
     * @param userId 用户ID
     * @param success 是否成功
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param keyword 搜索关键词
     * @param deviceId 设备ID
     * @param robotId 机器人ID
     * @param taskId 任务ID
     * @return 日志数量
     */
    Long countByCondition(
            @Param("logType") String logType,
            @Param("level") String level,
            @Param("app") String app,
            @Param("module") String module,
            @Param("action") String action,
            @Param("userId") String userId,
            @Param("success") Boolean success,
            @Param("startTime") OffsetDateTime startTime,
            @Param("endTime") OffsetDateTime endTime,
            @Param("keyword") String keyword,
            @Param("deviceId") String deviceId,
            @Param("robotId") String robotId,
            @Param("taskId") String taskId,
            @Param("extraField") String extraField,
            @Param("extraValue") String extraValue,
            @Param("deviceDataField") String deviceDataField,
            @Param("deviceDataValue") String deviceDataValue
    );
    
    /**
     * 根据ID查询日志
     * @param id 日志ID
     * @return 日志信息
     */
    OpsLogPO selectById(@Param("id") Long id);
    
    /**
     * 根据请求ID查询日志
     * @param requestId 请求ID
     * @return 日志列表
     */
    List<OpsLogPO> selectByRequestId(@Param("requestId") String requestId);
    
    /**
     * 日志聚合统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> aggregateStats(
            @Param("startTime") OffsetDateTime startTime,
            @Param("endTime") OffsetDateTime endTime
    );
    
    /**
     * 日志趋势统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param interval 时间间隔
     * @return 趋势统计结果
     */
    List<Map<String, Object>> trendStats(
            @Param("startTime") OffsetDateTime startTime,
            @Param("endTime") OffsetDateTime endTime,
            @Param("interval") String interval
    );
}



